from flask_restful import Resource, reqparse, request
from comment.models.index import *
from comment.utils.data2dict import datalist2dict, datalist_format
import json
from comment.utils.redis import redis_client


# 商品分类
class Shopping_Categort(Resource):
    def get(self):
        # 从redis读取数据
        data_cache = redis_client.get('index_category')
        if data_cache:  # 如果有数据，就返回
            return json.loads(data_cache)#将Json字符串解码成python对象,字典
        else:  # 如果没有，则从mysql查询数据，返回给用户，并且写入redis
            rq = reqparse.RequestParser()
            rq.add_argument('parent_id', required=True, type=int)
            req = rq.parse_args()
            parent_id = req.parent_id
            data = self.getData(parent_id)
            # 首先一级分类，parent_id是0，先查询所有一级分类，在传入一级分类的id为参数，在查询parent_id是一级分类的二级分类
            if data:
                for item in data:
                    item.update({'list': ''})  # 创建一个键为list
                    data_second = self.getData(item["id"])  # 参数是一级分类的id,比如id是6，那查询父id6下的所有子id
                    item['list'] = data_second  # 加入二级分类
                    for item1 in data_second:
                        item1.update({'list': ''})
                        data_third = self.getData(item1["id"])
                        item1['list'] = data_third
                redis_client.setex('index_category', 3600 * 24, json.dumps(data))#将python对象编码成Json字符串
                return data
            else:
                return {'message': 'none'}

    @staticmethod  # 静态方法就是类对外部函数的封装，不需要self
    def getData(parent_id):
        res = Category.query.with_entities(Category.id, Category.parent_id, Category.name) \
            .filter(Category.parent_id == parent_id).order_by(Category.sort.asc()).all()  # with_entities指定查询那些字段
        if res:
            return datalist2dict(res)
        else:
            return 'none'


# 测试
class Dict_test(Resource):
    def get(self):
        # 取多条数据
        res = Category.query.with_entities(Category.name).filter(Category.parent_id == 0).all()
        if res:
            return datalist2dict(res)
        else:
            return 'none'


#首页新品推荐的资源类
class Shopping_HomeNewProduct(Resource):
    def get(self):
        #join内连接，，连接两张表查询,和商品表连接
        res=HomeNewProduct.query.join(Product,HomeNewProduct.product_id==Product.id)\
            .with_entities(Product.id,Product.product_name,Product.price,Product.default_pic,Product.rel_category3_id)\
            .order_by(HomeNewProduct.sort.asc()).limit(10).all()
        if res:
            return datalist2dict(res)
        else:
            return {'message':'none'}

#首页人气热搜的资源类
class Shopping_HomeRecommendProduct(Resource):
    def get(self):
        data_cache=redis_client.get('index_HomeRecommendProduct')
        if data_cache:
            return json.loads(data_cache)
        else:
            res = HomeRecommendProduct.query.join(Product, HomeRecommendProduct.product_id == Product.id)\
                .with_entities(Product.id, Product.product_name, Product.price, Product.default_pic,
                               Product.rel_category3_id)\
                .limit(10).all()
            if res:
                data=datalist2dict(res)
                #将资源写入redis
                redis_client.setex('index_HomeRecommendProduct',3600*24,json.dumps(data))
                return data
            else:
                return {'message': 'none'}


#首页专题的资源类
class Shopping_RecommendSubject(Resource):
    def get(self):
        data_cache=redis_client.get('index_RecommendSubject')
        #从redis读取数据
        if data_cache:
            return json.loads(data_cache)
        else:
            res=CmsSubject.query.filter(CmsSubject.show_status==1).all()#查询专题表的状态是否为1
            if res:
                #返回的是字典
                data = datalist2dict(res)
                for i in range(len(data)):  # 状态为1的有两条数据，循环两次，1，2，要求商品的id和专题商品关系表的product_id一样，就是拿到根product_id一样的商品
                    # 再查询跟专题表的id，跟商品id对应，data[i]['id']就是id是1和2的专题表
                    res_product = CmsSubjectProductRelation.query.join(Product,
                        CmsSubjectProductRelation.product_id == Product.id)\
                        .filter(CmsSubjectProductRelation.subject_id == data[i]['id']).with_entities\
                        (Product.id, Product.default_pic, Product.price, Product.product_name,
                         Product.rel_category3_id).limit(10).all()
                    if res_product:
                        data[i]['productList'] = datalist2dict(res_product)  # 创建一个productList的字段，存储数据
                    else:
                        data[i]['productList'] = ''

                    redis_client.setex('index_RecommendSubject',3600*24,json.dumps(data))
                return data
            else:
                return {'message':'none'}































